home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / telecomm / uwsrc.arc / STARTGEM.S < prev    next >
Text File  |  1989-04-29  |  4KB  |  160 lines

  1. /
  2. /    STARTGEM.S    6-MAR-1987    by GHOST-Soft
  3. /
  4. /    This program is used to start GEM programs from within the AUTO folder.
  5. /
  6. /    The code is probably highly nonportable, as it heavily depends on the
  7. /    internal organisation of code in TOS/GEM.
  8. /    As this program works with ROM- as well as all disk-based versions
  9. /    of German TOS, I'm pretty sure that this program works with foreign
  10. /    versions of TOS, too.
  11. /    All addresses given in square brackets apply to the German ROM-TOS.
  12. /
  13. /    Assemble with Mark Williams assembler:
  14. /        as -o startgem.o startgem.s
  15. /        gemfix startgem.o startgem.prg
  16. /        strip startgem.prg
  17. /            _or_
  18. /        as -o startgem.o startgem.s
  19. /        ld -o startgem.prg -s startgem.o
  20. /
  21.  
  22. linef=        0x2c
  23. vbllist1=    0x4d2
  24.  
  25. gemdos=        1
  26.   cconws=    0x9
  27.   fsetdta=    0x1a
  28.   super=    0x20
  29.   ptermres=    0x31
  30.   fsfirst=    0x4e
  31. xbios=        14
  32.   vsync=    0x25
  33.  
  34.     .shri
  35. start:
  36.     lea    basepage(pc),a0
  37.     move.l    4(a7),(a0)    / get basepage address
  38.  
  39.     pea    msg(pc)
  40.     move.w    $cconws,-(a7)    / print line
  41.     trap    $gemdos
  42.     addq.w    $6,a7
  43.  
  44.     moveq    $70,d2        / wait 1 second = 71 vblanks
  45. 1:    move.w    $vsync,-(a7)    / wait for vertical blank
  46.     trap    $xbios
  47.     addq.w    $2,a7
  48.     dbra    d2,1b
  49.  
  50.     clr.l    -(a7)
  51.     move.w    $super,-(a7)    / enter super mode
  52.     trap    $gemdos
  53.     addq.w    $6,a7        / keep old super sp in d0
  54.  
  55.     moveq    $-1,d2
  56.     move.l    d2,linef    / set line-f emulator trap
  57.     lea    vblank(pc),a2
  58.     move.l    a2,vbllist1    / set vblank vector #1  {0..7}
  59.  
  60.     move.l    d0,-(a7)
  61.     move.w    $super,-(a7)    / exit super mode
  62.     trap    $gemdos
  63.     addq.w    $6,a7
  64.  
  65.     lea    basepage(pc),a0    / compute number of bytes to keep
  66.     suba.l    basepage(pc),a0
  67.     clr.w    -(a7)        / 0 = no error
  68.     move.l    a0,-(a7)
  69.     move.w    $ptermres,-(a7)    / terminate and stay resident
  70.     trap    $gemdos        / this call never returns
  71.  
  72. vblank:
  73.     moveq    $-1,d0
  74.     cmp.l    linef,d0
  75.     beq.s    1f
  76.     clr.l    vbllist1    / clear vblank vector #1
  77.     movea.l    linef,a0
  78.     lea    old_lf(pc),a1
  79.     move.l    a0,(a1)        / save old line-f vector (usually in low RAM)
  80.     lea    new_lf(pc),a1
  81.     move.l    a1,linef    / install new one
  82.  
  83.     / find the address of the buffer that GEM uses for the
  84.     / name of the program that it is going to execute
  85.     movea.l    0x16(a0),a0    / get start of line-f table from instruction
  86.     / [a0 = fee8bc]        move.l $0xfee8bc,a0
  87.     movea.l    0x7c8(a0),a0    / get address of routine 'f7c8' from table
  88.     / [a0 = fd8fc4]
  89.     movea.l    0xa(a0),a2    / get address from instruction
  90.     / [a2 = 73e4]        move.l $0x73e4,a5
  91.     adda.w    0x10(a0),a2    / add offset 0x1f56 from instruction
  92.     / [a2 = 933a]        lea 0x1f56,a0
  93.     lea    pointer(pc),a1
  94.     move.l    a2,(a1)        / save buffer address
  95. 1:    rts
  96.  
  97. new_lf:
  98.     movea.l    2(a7),a0    / get addr. of instr. that caused exception
  99.     cmpi.w    $0xf08c,(a0)    / 'f08c' is the line-f instr. we're looking for
  100.     bne.w    exit
  101.     move.l    old_lf(pc),linef    / restore old line-f vector
  102.  
  103.     movea.l    pointer(pc),a0
  104.     lea    filename(pc),a1
  105. 1:    move.b    (a1)+,(a0)+    / copy filename into GEM buffer space
  106.     bne.s    1b
  107.  
  108.     pea    dta
  109.     move.w    $fsetdta,-(a7)    / set DTA
  110.     trap    $gemdos
  111.     addq.l    $6,a7
  112.     move.w    $0x27,-(a7)    / don't look at volumes and directories
  113.     pea    filename(pc)
  114.     move.w    $fsfirst,-(a7)    / search first
  115.     trap    $gemdos
  116.     addq.l    $8,a7
  117.     tst    d0        / status != 0 indicates error
  118.     bne.s    exit
  119.  
  120.     movea.l    2(a7),a0    / get addr. of instr. that caused exception
  121.     / [a0 = fed188]
  122. 2:    cmpi.w    $0xf4b8,(a0)    / look for line-f instruction 'f4b8'
  123.     beq.s    doload
  124.     addq.l    $2,a0
  125.     cmpa.l    $0xfefffe,a0    / test for ROM end
  126.     beq.s    exit
  127.     cmpa.l    $0x078000,a0    / test for RAM end (on 512K machine)
  128.     bne.s    2b        / {RAM-TOS usually loads much lower}
  129.  
  130. exit:
  131.     movea.l    old_lf(pc),a0    / resume execution of regular line-f handler
  132.     jmp    (a0)
  133.  
  134. doload:
  135.     / [a0 = fe1de2]
  136.     move.w    (a7)+,d2    / pop status word
  137.     addq.w    $4,a7        / destroy addr. of instr. 'f08c'
  138.     move.w    d2,sr        / restore status register
  139.     adda.w    $56,a7        / destroy parameters of instr. 'f08c'
  140.     jmp    (a0)        / jump to instruction 'f4b8'
  141.  
  142.     .prvd
  143. dta:
  144.     .blkb    44
  145. old_lf:
  146.     .blkl    1
  147. pointer:
  148.     .blkl    1
  149.  
  150. msg:
  151.     .ascii    "\033\105Autostart of "
  152. filename:
  153.     .ascii    "a:\\bin\\UW.PRG"
  154. nulls:
  155.     .blkb    20        / these nulls allow easy patching of code file
  156.  
  157.     .even
  158. basepage:
  159.     .ascii    "EOPA"        / magic number indicates End Of Patch Area
  160.